﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Web.Configuration;

using MvcEngine.Core.Repositories;
using MvcEngine.Core;
using System.Data.Linq;
using MvcEngine.Core.Account;
using MvcEngine.Core.Base;
using MvcEngine.Core.Extensions;
using MvcEngine.Core.Pagination;

namespace MvcEngine.LinqToSqlProvider
{
    public class UserRepository : Repository, IUserRepository
    {
        public User Get(Guid id)
        {
            using (var contextManager = CreateContextManager(true))
            {
                return contextManager.Context.Users().SingleOrDefault(t => t.Id == id && t.SiteId == SiteContext.Current.Site.Id);
            }
        }

        public virtual User Get(string name, Guid siteId)
        {
            using (var contextManager = CreateContextManager(true))
            {
                return contextManager.Context.Users().SingleOrDefault(u => u.Name == name && u.SiteId == siteId);
            }
        }

        public virtual User GetUserByCreateKey(Guid value)
        {
            using (var contextManager = CreateContextManager(true))
            {
                return contextManager.Context.Users().SingleOrDefault(u => u.CreateGuid == value);
            }
        }

        public virtual User GetUserByRestoreKey(Guid value)
        {
            using (var contextManager = CreateContextManager(true))
            {
                return contextManager.Context.Users().SingleOrDefault(u => u.RestoreGuid == value);
            }
        }

        public void Add(User entity)
        {
            using (var contextManager = CreateContextManager(false))
            {
                contextManager.Context.Users().InsertOnSubmit(entity);
                contextManager.Commit();
            }
        }

        public void Update(User entity)
        {
            using (var contextManager = CreateContextManager(false))
            {
                contextManager.Commit();
            }
        }

        public IPagination<User> GetAll(Guid siteId, LoadOptions options)
        {
            using (var contextManager = CreateContextManager(true))
            {
                return contextManager.Context.GetTable<User>().Where(t => ((IUnique)t).SiteId == SiteContext.Current.Site.Id)
                    .GetPage(options.PageNumber, options.PageSize);
            }
        }

        #region IUserRepository Members


        public void Delete(Guid id)
        {
            throw new NotImplementedException();
        }

        public void DeleteAll()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    //private static string ErrorCodeToString(MembershipCreateStatus createStatus)
    //    {
    //        // See http://msdn.microsoft.com/en-us/library/system.web.security.membershipcreatestatus.aspx for
    //        // a full list of status codes.
    //        switch (createStatus)
    //        {
    //            case MembershipCreateStatus.DuplicateUserName:
    //                return "Username already exists. Please enter a different user name.";

    //            case MembershipCreateStatus.DuplicateEmail:
    //                return "A username for that e-mail address already exists. Please enter a different e-mail address.";

    //            case MembershipCreateStatus.InvalidPassword:
    //                return "The password provided is invalid. Please enter a valid password value.";

    //            case MembershipCreateStatus.InvalidEmail:
    //                return "The e-mail address provided is invalid. Please check the value and try again.";

    //            case MembershipCreateStatus.InvalidAnswer:
    //                return "The password retrieval answer provided is invalid. Please check the value and try again.";

    //            case MembershipCreateStatus.InvalidQuestion:
    //                return "The password retrieval question provided is invalid. Please check the value and try again.";

    //            case MembershipCreateStatus.InvalidUserName:
    //                return "The user name provided is invalid. Please check the value and try again.";

    //            case MembershipCreateStatus.ProviderError:
    //                return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

    //            case MembershipCreateStatus.UserRejected:
    //                return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

    //            default:
    //                return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
    //        }
    //    }
}
